home *** CD-ROM | disk | FTP | other *** search
-
- (function() {
-
- // mono-state
- var meta;
-
- Polymer('core-icon', {
-
- /**
- * The URL of an image for the icon. If the src property is specified,
- * the icon property should not be.
- *
- * @attribute src
- * @type string
- * @default ''
- */
- src: '',
-
- /**
- * Specifies the icon name or index in the set of icons available in
- * the icon's icon set. If the icon property is specified,
- * the src property should not be.
- *
- * @attribute icon
- * @type string
- * @default ''
- */
- icon: '',
-
- /**
- * Alternative text content for accessibility support.
- * If alt is present and not empty, it will set the element's role to img and add an aria-label whose content matches alt.
- * If alt is present and is an empty string, '', it will hide the element from the accessibility layer
- * If alt is not present, it will set the element's role to img and the element will fallback to using the icon attribute for its aria-label.
- *
- * @attribute alt
- * @type string
- * @default ''
- */
- alt: null,
-
- observe: {
- 'icon': 'updateIcon',
- 'alt': 'updateAlt'
- },
-
- defaultIconset: 'icons',
-
- ready: function() {
- if (!meta) {
- meta = document.createElement('core-iconset');
- }
-
- // Allow user-provided `aria-label` in preference to any other text alternative.
- if (this.hasAttribute('aria-label')) {
- // Set `role` if it has not been overridden.
- if (!this.hasAttribute('role')) {
- this.setAttribute('role', 'img');
- }
- return;
- }
- this.updateAlt();
- },
-
- srcChanged: function() {
- var icon = this._icon || document.createElement('div');
- icon.textContent = '';
- icon.setAttribute('fit', '');
- icon.style.backgroundImage = 'url(' + this.src + ')';
- icon.style.backgroundPosition = 'center';
- icon.style.backgroundSize = '100%';
- if (!icon.parentNode) {
- this.appendChild(icon);
- }
- this._icon = icon;
- },
-
- getIconset: function(name) {
- return meta.byId(name || this.defaultIconset);
- },
-
- updateIcon: function(oldVal, newVal) {
- if (!this.icon) {
- this.updateAlt();
- return;
- }
- var parts = String(this.icon).split(':');
- var icon = parts.pop();
- if (icon) {
- var set = this.getIconset(parts.pop());
- if (set) {
- this._icon = set.applyIcon(this, icon);
- if (this._icon) {
- this._icon.setAttribute('fit', '');
- }
- }
- }
- // Check to see if we're using the old icon's name for our a11y fallback
- if (oldVal) {
- if (oldVal.split(':').pop() == this.getAttribute('aria-label')) {
- this.updateAlt();
- }
- }
- },
-
- updateAlt: function() {
- // Respect the user's decision to remove this element from
- // the a11y tree
- if (this.getAttribute('aria-hidden')) {
- return;
- }
-
- // Remove element from a11y tree if `alt` is empty, otherwise
- // use `alt` as `aria-label`.
- if (this.alt === '') {
- this.setAttribute('aria-hidden', 'true');
- if (this.hasAttribute('role')) {
- this.removeAttribute('role');
- }
- if (this.hasAttribute('aria-label')) {
- this.removeAttribute('aria-label');
- }
- } else {
- this.setAttribute('aria-label', this.alt ||
- this.icon.split(':').pop());
- if (!this.hasAttribute('role')) {
- this.setAttribute('role', 'img');
- }
- if (this.hasAttribute('aria-hidden')) {
- this.removeAttribute('aria-hidden');
- }
- }
- }
-
- });
-
- })();
-